"""
    定义所有的序列化器
"""
from rest_framework import serializers
from rest_framework.validators import ValidationError
from .models import *   # 从当前的包中的models导入所有模型类

# 自定义的
def yourfunc(name):
    print("自定义的 校验器.....")
    return name

    # raise ValidationError("数据不符合规则")


# 部门的序列化器
class DepartmentSerializer(serializers.Serializer):

    # 定义要序列化的字段
    id = serializers.IntegerField(label="部门id", read_only=True)
    name = serializers.CharField(label="部门名称", max_length=30, min_length=2, default='AI',
                                 allow_null=True, trim_whitespace=True, validators=[yourfunc,])

    # 重写验证数据的方法
    def validate(self, attrs):
        # 实现自己的逻辑
        print("重写的validate 校验方法.....")
        return attrs

        # 验证不通过 引发一个异常

    # 创建数据时，必须重写create 方法
    def create(self, validated_data):
        # 自己实现数据保存
        print("这是我自己定义的create方法.....")
        dep = Department.objects.create(**validated_data)
        return dep

    # 更新数据时，必须重写update方法
    def update(self, instance, validated_data):
        print("这是我重写的update方法.....")
        # 更新部门的名称
        instance.name = validated_data.get("name")
        instance.save()

        return instance


#  基于ModelSerializer的部门序列化器
class DepartmentModelSerializer(serializers.ModelSerializer):

    class Meta:
        model = Department
        # fields = "__all__"
        fields = ['id', "name", ]
        read_only_field = ["id",]

    # 总结
    # 1. ModelSerializer 可以自动生成序列化的字段； Serializer需要自己定义序列化字段
    # 2. ModelSerializer 可以生成基本的校验器； Serializer 需要指定参数 或者定义validators
    # 3. ModelSerializer 已经重写create update ； Seializer 需要自己重写create update方法
    # 4. 序列化输出时，两者区别不大
    # 注意： 若ModelSerializer重写的create update 无法实现我们需要的逻辑， 此时必须要重写create / update


# 基于ModelSerializer 定义员工的序列化器
class StaffModelSerializer(serializers.ModelSerializer):

    department = serializers.PrimaryKeyRelatedField(label="部门", queryset=Department.objects.all())
    # 获取部门的名称
    department_name = serializers.SerializerMethodField(read_only=True)

    def get_department_name(self, obj):
        return obj.department.name

    # 工作职责 属性
    duty = serializers.PrimaryKeyRelatedField(label="职责", queryset=Duty.objects.all())
    # 工作职责的名称
    duty_name = serializers.SerializerMethodField(read_only=True)

    def get_duty_name(self, obj):
        return obj.duty.name

    class Meta:
        model = Staff
        fields = ['id', "name", "phone", "department", "department_name", "duty", "duty_name"]
        read_only_fields = ['id',]




